//
//  XTUserAccount.swift
//  MyBlog
//
//  Created by victor on 16/12/22.
//  Copyright © 2016年 victor. All rights reserved.
//

import UIKit

fileprivate let accountFile: NSString = "userAccount.json"

class XTUserAccount: NSObject {
    
    /// 访问令牌
    var access_token: String? //= "2.00b3D8rC3wzK9Dc4b2c4ef04hohU4B"
    
    /// 用户代号
    var uid: String?
    
    /// access_token 的生命周期，单位是秒数
    // swift里timer类型用 TimeInterval
    // 开发者 5年 每次登录之后 都是5年
    // 使用者 3天 会从第一次登录时间递减
    var expires_in: TimeInterval = 0 {
        didSet {
            // timeIntervalSinceNow 初始化为以当前时间为基准，然后过了secs秒的时间
            expiresDate = Date(timeIntervalSinceNow: expires_in)
        }
    }
    
    /// 过期日期
    var expiresDate: Date?
    
    /// 用户昵称
    var screen_name: String?
    
    /// 用户图像地址（大图）,180*180像素
    var avatar_large: String?
    
    //实例化的时候直接调用了这个方法，来读取沙盒中的信息
    override init() {
        super.init()
        
        // 从磁盘加载保存的文件 得到-> 字典
        // 加载磁盘文件到二进制数据，如果失败直接返回
        guard let path = accountFile.cz_appendDocumentDir(),
            let data = NSData(contentsOfFile: path),
            let dict = try? JSONSerialization.jsonObject(with: data as Data, options: []) as? [String: Any]
            else {
                return
        }
        
        // 使用字典设置属性值
        // *** 用户是否登录的关键代码
        yy_modelSet(with: dict ?? [:])
        
        print("从沙盒加载用户信息\(self)")
        
        // 判断 token 是否过期
        // 测试过期日期 - 开发中，每一个分支都需要测试！
        // expiresDate = Date(timeIntervalSinceNow: -3600 * 24)
        // print(expiresDate)
        // 如果 过期时间 比 当前时间 大 就是 orderedDescending 降序
        // 如果不等于 orderedDescending 说明 过期时期比当前日期小，过期了
        if expiresDate?.compare(Date()) != .orderedDescending {
            print("账户过期")
            
            // 清空 token 
            access_token = nil
            uid = nil
            
            // 删除文件
            _ = try? FileManager.default.removeItem(atPath: path)
        }
    }
    
    override var description: String {
        return yy_modelDescription()
    }
    
    /**
     1. 偏好设置(存小数据)
     2. 沙盒- 归档／plist/`json`
     3. 数据库(FMDB/CoreData)
     4. 钥匙串访问(小数据／自动加密 - 需要使用框架-SSKeychain)
     */
    func saveAccount() {
        
        // 模型转字典
        var dict = (self.yy_modelToJSONObject() as? [String: Any]) ?? [:]
        
        // 需要删除 expires_in 值，如果不删除就都一起写入了
        dict.removeValue(forKey: "expires_in")
        
        // 字典序列化
        guard let data = try? JSONSerialization.data(withJSONObject: dict, options: []),
            let filePath = accountFile.cz_appendDocumentDir()
            else {
                return
        }
        
        // 写入磁盘
        (data as NSData).write(toFile: filePath, atomically: true)
        
         print("用户账户保存成功 \(filePath)")
    }
}
